package com.project.demo.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * 短信服务类
 * 支持阿里云短信、腾讯云短信等多种服务商
 */
@Slf4j
@Service
public class SmsService {

    @Value("${sms.enabled:false}")
    private boolean smsEnabled;

    @Value("${sms.provider:mock}")
    private String smsProvider; // mock, aliyun, tencent

    // 阿里云短信配置
    @Value("${sms.aliyun.accessKeyId:}")
    private String aliyunAccessKeyId;

    @Value("${sms.aliyun.accessKeySecret:}")
    private String aliyunAccessKeySecret;

    @Value("${sms.aliyun.signName:}")
    private String aliyunSignName;

    @Value("${sms.aliyun.templateCode:}")
    private String aliyunTemplateCode;

    // 腾讯云短信配置
    @Value("${sms.tencent.secretId:}")
    private String tencentSecretId;

    @Value("${sms.tencent.secretKey:}")
    private String tencentSecretKey;

    @Value("${sms.tencent.appId:}")
    private String tencentAppId;

    @Value("${sms.tencent.signName:}")
    private String tencentSignName;

    @Value("${sms.tencent.templateId:}")
    private String tencentTemplateId;

    /**
     * 发送短信
     * @param phoneNumber 手机号码
     * @param templateCode 模板代码（可选，如果使用默认模板可以传null）
     * @param params 模板参数
     * @return 发送结果
     */
    public Map<String, Object> sendSms(String phoneNumber, String templateCode, Map<String, String> params) {
        Map<String, Object> result = new HashMap<>();

        // 验证手机号码
        if (phoneNumber == null || phoneNumber.trim().isEmpty()) {
            result.put("success", false);
            result.put("message", "手机号码不能为空");
            return result;
        }

        // 简单验证手机号码格式（11位数字）
        if (!phoneNumber.matches("^1[3-9]\\d{9}$")) {
            result.put("success", false);
            result.put("message", "手机号码格式不正确");
            return result;
        }

        // 如果短信功能未启用，返回模拟结果
        if (!smsEnabled || "mock".equals(smsProvider)) {
            log.info("短信服务（模拟模式） - 手机号: {}, 内容: {}", phoneNumber, params);
            result.put("success", true);
            result.put("message", "短信发送成功（模拟模式）");
            result.put("mock", true);
            return result;
        }

        try {
            // 根据服务商选择不同的发送方式
            switch (smsProvider.toLowerCase()) {
                case "aliyun":
                    return sendAliyunSms(phoneNumber, templateCode, params);
                case "tencent":
                    return sendTencentSms(phoneNumber, templateCode, params);
                default:
                    result.put("success", false);
                    result.put("message", "不支持的短信服务商: " + smsProvider);
                    return result;
            }
        } catch (Exception e) {
            log.error("发送短信失败", e);
            result.put("success", false);
            result.put("message", "发送短信失败: " + e.getMessage());
            return result;
        }
    }

    /**
     * 发送阿里云短信
     */
    private Map<String, Object> sendAliyunSms(String phoneNumber, String templateCode, Map<String, String> params) {
        Map<String, Object> result = new HashMap<>();

        if (aliyunAccessKeyId == null || aliyunAccessKeyId.isEmpty()) {
            log.warn("阿里云短信配置未完成，使用模拟模式");
            result.put("success", true);
            result.put("message", "短信发送成功（模拟模式：阿里云配置未完成）");
            result.put("mock", true);
            return result;
        }

        // TODO: 实现阿里云短信发送逻辑
        // 这里需要集成阿里云短信SDK
        // 参考：https://help.aliyun.com/document_detail/101414.html

        log.info("阿里云短信发送 - 手机号: {}, 模板: {}, 参数: {}", phoneNumber, templateCode, params);
        result.put("success", true);
        result.put("message", "短信发送成功（阿里云）");
        return result;
    }

    /**
     * 发送腾讯云短信
     */
    private Map<String, Object> sendTencentSms(String phoneNumber, String templateCode, Map<String, String> params) {
        Map<String, Object> result = new HashMap<>();

        if (tencentSecretId == null || tencentSecretId.isEmpty()) {
            log.warn("腾讯云短信配置未完成，使用模拟模式");
            result.put("success", true);
            result.put("message", "短信发送成功（模拟模式：腾讯云配置未完成）");
            result.put("mock", true);
            return result;
        }

        // TODO: 实现腾讯云短信发送逻辑
        // 这里需要集成腾讯云短信SDK
        // 参考：https://cloud.tencent.com/document/product/382/43194

        log.info("腾讯云短信发送 - 手机号: {}, 模板: {}, 参数: {}", phoneNumber, templateCode, params);
        result.put("success", true);
        result.put("message", "短信发送成功（腾讯云）");
        return result;
    }

    /**
     * 构建通知短信内容（通用方法）
     */
    public String buildNotificationContent(String type, Map<String, String> data) {
        StringBuilder content = new StringBuilder();
        
        if ("住宿".equals(type)) {
            content.append("【会议通知】您的住宿安排已确认。");
            if (data.containsKey("conference_name")) {
                content.append("会议：").append(data.get("conference_name")).append("。");
            }
            if (data.containsKey("accommodation_location")) {
                content.append("住宿地点：").append(data.get("accommodation_location")).append("。");
            }
            if (data.containsKey("accommodation_no")) {
                content.append("房号：").append(data.get("accommodation_no")).append("。");
            }
            if (data.containsKey("user_name")) {
                content.append("用户：").append(data.get("user_name")).append("。");
            }
        } else if ("通知".equals(type) || "用户通知".equals(type)) {
            content.append("【会议通知】");
            if (data.containsKey("notification_content")) {
                content.append(data.get("notification_content"));
            } else {
                content.append("您有新的会议通知，请及时查看。");
            }
            if (data.containsKey("conference_name")) {
                content.append(" 会议：").append(data.get("conference_name")).append("。");
            }
        } else if ("排座".equals(type) || "座位".equals(type)) {
            content.append("【会议通知】您的座位安排已确认。");
            if (data.containsKey("conference_name")) {
                content.append("会议：").append(data.get("conference_name")).append("。");
            }
            if (data.containsKey("seat_number")) {
                content.append("座位号：").append(data.get("seat_number")).append("。");
            }
            if (data.containsKey("meeting_venue")) {
                content.append("会议地点：").append(data.get("meeting_venue")).append("。");
            }
            if (data.containsKey("user_name")) {
                content.append("用户：").append(data.get("user_name")).append("。");
            }
        } else {
            content.append("【会议通知】您有新的会议相关信息，请及时查看。");
        }

        return content.toString();
    }
}

